package com.exwave.socialgame.model_user.service;

import com.exwave.socialgame.model_user.dao.SignDao;
import com.exwave.socialgame.model_user.dao.UserDao;
import com.exwave.socialgame.model_user.entity.Sign;
import com.exwave.socialgame.model_user.entity.User;
import com.exwave.socialgame.jwt_token.TokenService;
import com.exwave.socialgame.myutils.RedisForUser;
import com.exwave.socialgame.myutils.ReturnUtils;
import com.exwave.socialgame.myutils.TimeUtils;

import org.springframework.stereotype.Service;

import java.util.List;

import javax.annotation.Resource;

/**
 * (Sign)表服务实现类
 *
 * @author makejava
 * @since 2021-10-24 12:55:53
 */
@Service("signService")
public class SignServiceImpl implements SignService {
    @Resource
    private SignDao signDao;
    @Resource
    private UserDao userDao;
    @Resource
    private RedisForUser redisForUser;
    @Resource
    private TokenService tokenService;

    /**
     * 通过ID查询单条数据
     *
     * @param sid 主键
     * @return 实例对象
     */
    @Override
    public Sign queryById(int sid) {
        Sign sign = this.signDao.queryById(sid);
        ReturnUtils.isObjNull(sign, "没有查询到登录记录");
        return sign;
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Sign> queryAllByLimit(int offset, int limit) {
        return this.signDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param sign 实例对象
     * @return 实例对象
     */
    @Override
    public Sign insert(Sign sign) {
        this.signDao.insert(sign);
        return sign;
    }

    /**
     * 登录
     *
     * @param tel      账户名
     * @param password 密码
     * @return User
     */
    public User login(String tel, String password) {

        User user = this.userDao.queryByTel(tel);
        ReturnUtils.isObjNull(user, "用户不存在");
        ReturnUtils.isTrue(!user.getUpassword().equals(password), "账户密码错误");
        //数据库中存在且用户名密码匹配
        Sign sign = new Sign();
        sign.setStype(0);
        sign.setSid(this.userDao.queryByTel(tel).getUid());
        sign.setStime(TimeUtils.getTime());//获取当前时间
        String token = tokenService.getToken(user); //创建Token
        sign.setToken(token);
        this.signDao.insert(sign);//插入登陆列表
        redisForUser.saveLogin(sign); //数据缓存redis
        return user;
    }


    /**
     * 退出登陆
     *
     * @param sid 关键字
     * @return Sign
     */
    @Override
    public boolean logout(int sid) {
        return redisForUser.delLogin(sid);
    }
}